let oldArrayPrototype = Array.prototype;//获取数组老的原型方法

export let arrayMethods = Object.create(oldArrayPrototype);//通过arrayMethods 通过__proto__能获取到数组的方法
//arrayMethods.__proto__  == oldPrototype
//array.push = function (相当于重新push)

//只要这七个方法 可以导致数组变化
let methods = [//只有这七个方法 可以导致数组发生变化
    'push',
    'shift',
    'pop',
    'unshift',
    'reserve',
    'sort',
    'splice'
]

methods.forEach(method=>{
    arrayMethods[method] = function (...args) {
        //需要调用数组原生的逻辑
        oldArrayPrototype[method].call(this,...args);

        //todo... 可以自己添加逻辑 函数劫持 切片
        //数组的新增的属性 看一下是不是对象 如果是对象 继续劫持
        //判断增加数组的功能
        let inserted = [];
        let obj  = this.__ob__;
        switch (method) {
            case 'splice'://修改 删除 添加 arr.splice(0,0,1);
            inserted = args.slice(2);//splice方法从第三个参数起 是增添的新数据
            case 'push':
            case 'unshift':
                inserted = args;
                break;
        }
        //inserted[] 遍历数组 看一下是否需要进行二次检测
        if (inserted){
            obj.observeArray(inserted)
        }
        obj.dep.notify();//触发更新流程
    }
});

//属性的查找 是先找自己身上的 找不到再去原型上找